home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Snippets / LocateFile / LocateFile.c next >
Encoding:
C/C++ Source or Header  |  1994-10-28  |  1.9 KB  |  67 lines  |  [TEXT/MMCC]

  1. #include "LocateFile.h"
  2.  
  3. #define    Bump(action)    if (e = action) return e
  4.  
  5. OSErr LocateFile (OSType where, OSType fdType, OSType fdCreator, short strFileName, FSSpec *spec, Boolean create, Boolean *wasAbsent, Boolean copyVers)
  6. {
  7.     short        index;
  8.     CInfoPBRec    fpb;
  9.     Boolean        finished;
  10.     OSErr        e;
  11.     StringHandle    name;
  12.     Str255        emptyName;
  13.     Handle        version;
  14.     short        refNum;
  15.     
  16.     Bump(FindFolder(kOnSystemDisk, where, kCreateFolder, &spec->vRefNum, &spec->parID));
  17.     
  18.     fpb.hFileInfo.ioNamePtr = spec->name;
  19.     index = 1;
  20.     finished = false;
  21.     do {                                                            // Loop over all files in the folder
  22.         fpb.hFileInfo.ioVRefNum = spec->vRefNum;
  23.         fpb.hFileInfo.ioDirID = spec->parID;
  24.         fpb.hFileInfo.ioFDirIndex = index;
  25.         
  26.         if ((e = PBGetCatInfoSync(&fpb)) == noErr)
  27.             if (fpb.hFileInfo.ioFlFndrInfo.fdType == fdType && fpb.hFileInfo.ioFlFndrInfo.fdCreator == fdCreator) {
  28.                 if (wasAbsent)
  29.                     *wasAbsent = false;                                // If the type and creator match, we have
  30.                 return noErr;                                        // found the right file, exit
  31.             }
  32.         
  33.         index++;
  34.     } while (e == noErr);
  35.     
  36.     if (wasAbsent)
  37.         *wasAbsent = true;                                            // The file wasn't found
  38.     
  39.     if (create) {                                                    // Create it if we were asked to do so
  40.         name = GetString(strFileName);
  41.         if (!name)
  42.             return memFullErr;
  43.         BlockMove(*name, spec->name, (*name)[0]+1);                    // Just a Pascal string copy...
  44.         ReleaseResource((Handle) name);
  45.         FSpCreateResFile(spec, fdCreator, fdType, 0);                        // Create the file
  46.         Bump(ResError());
  47.  
  48.         if (copyVers) {
  49.             version = GetResource('vers', 2);                            // Get our own version resource
  50.             if (version == NULL)
  51.                 return resNotFound;
  52.             DetachResource(version);
  53.             refNum = FSpOpenResFile(spec, fsRdWrPerm);                    // Open the file
  54.             Bump(ResError());
  55.             emptyName[0] = 0;
  56.             AddResource(version, 'vers', 2, emptyName);                    // Write the version resource into it
  57.             Bump(ResError());
  58.             WriteResource(version);
  59.             Bump(ResError());
  60.             CloseResFile(refNum);                                    // Close it
  61.         }
  62.         return noErr;
  63.     }
  64.     else
  65.         return fnfErr;
  66. }
  67.